From: Stefano Stabellini Date: Tue, 14 Dec 2010 18:55:53 +0000 (+0000) Subject: libxl: introduce libxl_need_xenpv_qemu X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=daf41b00bf0a8e720a80d3ff7719b7ab7b9c968f;p=xen.git libxl: introduce libxl_need_xenpv_qemu Introduce libxl_need_xenpv_qemu to detect if the caller needs to create a pv qemu instance (using libxl_create_xenpv_qemu). A positive reply depends on the number of pv console and vfbs, and the type of disk backends. Signed-off-by: Stefano Stabellini Signed-off-by: Ian Jackson --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index eb085a26fd..516589c35e 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2654,6 +2654,39 @@ static int libxl_build_xenpv_qemu_args(libxl__gc *gc, return 0; } +int libxl_need_xenpv_qemu(libxl_ctx *ctx, + int nr_consoles, libxl_device_console *consoles, + int nr_vfbs, libxl_device_vfb *vfbs, + int nr_disks, libxl_device_disk *disks) +{ + int i, ret = 0; + libxl__gc gc = LIBXL_INIT_GC(ctx); + + if (nr_consoles > 1) { + ret = 1; + goto out; + } + + for (i = 0; i < nr_consoles; i++) { + if (consoles[i].consback == LIBXL_CONSBACK_IOEMU) { + ret = 1; + goto out; + } + } + + if (nr_vfbs > 0) { + ret = 1; + goto out; + } + + if (nr_disks > 0 && !libxl__blktap_enabled(&gc)) + ret = 1; + +out: + libxl__free_all(&gc); + return ret; +} + int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, libxl_device_model_starting **starting_r) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 2ced9824bc..2a276c3088 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -376,6 +376,10 @@ int libxl_create_device_model(libxl_ctx *ctx, libxl_device_model_starting **starting_r); int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, libxl_device_model_starting **starting_r); +int libxl_need_xenpv_qemu(libxl_ctx *ctx, + int nr_consoles, libxl_device_console *consoles, + int nr_vfbs, libxl_device_vfb *vfbs, + int nr_disks, libxl_device_disk *disks); /* Caller must either: pass starting_r==0, or on successful * return pass *starting_r (which will be non-0) to * libxl_confirm_device_model or libxl_detach_device_model. */ diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 555531922a..a0d5da0826 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1675,6 +1675,7 @@ start: d_config.vifs, d_config.num_vifs, &dm_starting) ); } else { + int need_qemu = 0; libxl_device_console console; for (i = 0; i < d_config.num_vfbs; i++) { @@ -1686,12 +1687,18 @@ start: init_console_info(&console, 0, &state); console.domid = domid; - if (d_config.num_vfbs) + + need_qemu = libxl_need_xenpv_qemu(&ctx, 1, &console, + d_config.num_vfbs, d_config.vfbs, + d_config.num_disks, &d_config.disks[0]); + + if (need_qemu) console.consback = LIBXL_CONSBACK_IOEMU; + libxl_device_console_add(&ctx, domid, &console); libxl_device_console_destroy(&console); - if (d_config.num_vfbs) + if (need_qemu) libxl_create_xenpv_qemu(&ctx, domid, d_config.vfbs, &dm_starting); }